package reflect;

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
 * 不仅可以解决线程同步，还可以防止反射和反序列化。
 */
public enum Mgr08 implements Serializable {
    INSTANCE;
    long serialVersionUID = 1L;


    public static void m() {}

    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
//        for(int i=0; i<100; i++) {
//            new Thread(()->{
//                System.out.println(Mgr08.INSTANCE.hashCode());
//            }).start();
//        }


//        Class<Mgr08> clazz = Mgr08.class;

//        Field[] fields = clazz.getFields();
//        for (Field field : fields) {
//            System.out.println(field.getName());
//            System.out.println(field.getType());
//            System.out.println(field.getModifiers());
//        }
        //反射测试
        /*
        * public final class reflect.Mgr08 extends java.lang.Enum<reflect.Mgr08> {
        * public static final reflect.Mgr08 INSTANCE;
        * public static reflect.Mgr08[] values();
        * public static reflect.Mgr08 valueOf(java.lang.String);
        * public void m();
        * public static void main(java.lang.String[]);
        * static {}
        * }
        *
        * */

//        Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
//        for (Constructor<?> declaredConstructor : declaredConstructors) {
//            Object o = declaredConstructor.newInstance("xff",1);
//            System.out.println(o);
////            System.out.println(declaredConstructor); //private reflect.Mgr08(java.lang.String,int)
//        }

        //序列化和反序列化测试
        /*
        *
        * 在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中，
        * 反序列化的时候则是通过 java.lang.Enum 的 valueOf() 方法来根据名字查找枚举对象。
        *
        * 也就是说，以下面枚举为例，序列化的时候只将 DATASOURCE 这个名称输出，
        * 反序列化的时候再通过这个名称，查找对于的枚举类型，因此反序列化后的实例也会和之前被序列化的对象实例相同
        *
        * */
        try {
            Mgr08 s = Mgr08.INSTANCE;
            Mgr08 s2 = null;
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("Mgr08.txt"));
            out.writeObject(Mgr08.INSTANCE);
            s2 =(Mgr08) new ObjectInputStream(new FileInputStream("Mgr08.txt")).readObject();
            System.out.println(s2 == s);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

}
